package com.tedu;
/**
 * JavaSE 基础语法 JavaOOP JavaAPI【用--新华词典】
 *
 * 理解：查手册 类 抽象类 接口 具体的功能【构造器 方法 属性】
 *
 * 要求：会查API手册
 *
 * 高手提供  类      抽象类  接口
 *   使用并且学习
 *  左侧位--Packages      ①所有查包 【记住类在具体包】
 *  String Java写好的类   位于java.lang包下
 *  位于java.lang包下的类，可以不用导包
 * 左侧下为：接口 类 枚举 异常 错误 注解
 *
 * 已知现有包含：接口 类 抽象类 8000左右【需要用 学】
 *
 * 知道一个类--API文件查【解释跟参考】--使用类
 *
 * 【常用的API：字符串，包装类，集合【】，线程，多线程，IO流，异常，Socket套接字-网络编程
 *
 * 】
 */


import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**JavaAPI帮助文档
 * String字符串类-----位于Java.lang包下：不需要导入包
 * String特性：String类不可改变，由final修饰，不可以被继承
 *字符串 通过字符数组 组成 【底层封装字符数组，针对字符数组操作算法】
 * 字符串一旦创建：对象用远无法改变 但是字符串可以重新赋值
 * Java字符串在内容中采用Unicode编码集【顶级编码集】
 *
 */

public class StringAPI{
@Test
    public void testString(){
    char[] c={'H','E','L','L','O'};//静态数组6
    System.out.println(c);
    String str="Hello";//字符数组方法与属性--字符串共享
    str="world";//覆盖--修改
    System.out.println(str+"1");
}

/**
 * 常量池
 * String存在常量【内存--JVM--堆】池---->好处：减少内存开销
 * Java为了提高性能，静态字符串(字面量|常量|常量链接结果)
 * 在常量池中创建，并且使用同一个对象，重用静态字符串
 * 对于重复出现的字符串直接量，JVM虚拟机会从常量池当中进行获取
 * 如果查找到，返回改对象！
 */
@Test
    public void testString1(){
    String s1="java123";
    String s2="java123";
    System.out.println(s1==s2);//true
    String s3="java123";
    System.out.println(s1==s3);//true
    //+代表拼接字符串 JVM虚拟机对于字符串做优化：右侧字面量形式自动计算
    // 计算后结果，通过引入堆内存中，找常量池中存在：java123死值
    //s3重用s1对象
    String s="java";
    String s4=s+"123"; //新对象无法，从常量池当中获取
    //JVM虚拟机进行优化：引用对象+字面量，不可以进行计算
    System.out.println(s1==s4);  //false
    String s5=new String(); //引用类型
    //new出来的对象，全新对象
    System.out.println(s1==s5); //常量池：java123==对象：java123
}

/**
 * String API 常用方法
 * length()方法  返回值：int
 * 用法：返回当前字符串的长度(个数)
 * 字符串：包括空格，字符，汉字...
 * String 类采用Unicode编码集
 */
@Test
    public void testLength(){
    String s="hello"; //占十个字节，使用length从1开始
    System.out.println(s.length());
    String s1="我爱Java";//去掉空格，空格占字节
    System.out.println(s1.length());
}

/**
 * String API常用方法
 * indexOf方法【重点】
 * 用法：查找指定字符串中，首次出现的位置【下标位置】
 *       如果没有查到，返回-1
 */
@Test
    public void testIndexOf(){
    String str="thinking in java";
    int index=str.indexOf("o");
    System.out.println("返回坐标位置："+index);
    index=str.indexOf("in",3);
    System.out.println("返回坐标位置："+index);
}

/**
 * String API 方法
 * lastIndexOf("字符")
 * 用法：找到字符串中包含“字符”的最后一次出现位置【下标设置】
 */
@Test
   public void testLastIndexOf(){
    String s="thinking in java";
    int index=s.lastIndexOf("n");
    System.out.println("最后出现位置"+index);
}

/**
 * 【重点】
 * subString(int start,int end)方法 返回值：String
 * 用法：截取字符串，从start位置处开始截取
 * www.baidu.com
 * subString(int start)方法 返回值：String
 * 用法：截取字符串 从start开始截取 没有end 直接截取到最后
 *
 */
@Test
public void testSubIndexOf(){
    String url="www.baidu.com";
   //需求：获取当前字符串中：baidu.子字符串
    String s=url.substring(5,9);
    System.out.println("截取后的子字符串"+s);
    //需求：获取当url前字符串中 baidu.com
    String s1=url.substring(4);
    System.out.println("截取到最后的字符串"+s1);


}

/**
 * trim()
 *用法：去掉字符串两边的空格
 * 验证码：X34d      解决并发现问题【延迟操作】
 */
@Test
public void testTrim(){
    String str=" X34d "; //字节：12个，空格算
    str=str.trim();//覆盖 不写前面数据类型
    System.out.println(str);
}

/**
 * charAt(int index)  返回值 char类型
 * 用法：返回字符串中对应下标的字符
 *
 */
@Test
public void testCharAt(){
    String str="thinking in java";  //java编程思想 第四版
    char c=str.charAt(2);
    System.out.println("获取的字符是："+c);
}

/**
 * 验证码：X43d    同意切换为大小写判断
 * toUpperCase()  字符串转换为大写
 * toLowerCase()  字符串转换为小写
 *
@Test
    public void testUL(){
    String str="X43d"; //判断 大小写分明  需求：去空格，转大小写
    str=str.toLowerCase();
    System.out.println("转换为小写"+str);
    str=str.toUpperCase();
    System.out.println("转换为大写"+str);
}

/**
 * 【重点 ser】
 * 静态方法：通过类名直接调用方法
 * valueOf()   返回值boolean
 * 用法:将java中基础数据类型转化为字符串
 */
@Test
    public void testValueOf(){
    int i=123;
    String s=String.valueOf(i);
    //验证：当前s对象是否等于”123“  equals()默认：对比对象 死值对比死值
    if(s.equals("123")){//字面量equals（字面量）按照实际值判断
        System.out.println("是字符串，转换成功~");
    }else {
        System.out.println("不是字符串，转换失败");
    }


}

/**正则表达式 匹配【验证】字符串  ---不是重点【了解】
 * 校验数字的表达式数字：^[0-9]*$
 *
 * matches()方法
 * 作用：用于验证字符串，通过正则表达式进行验证【过渡字符】
 */
public static void main(String[] args) {
    String regex="^[0-9]*$";  //验证数值
    System.out.println("请输入：");
    Scanner input=new Scanner(System.in); //从控制台输入，用来测试
    //验证：从控制台输入数值，matches方法验证是否是数值
    if(input.nextLine().matches(regex)){
        System.out.println("是数值");
    }else{
        System.out.println("不是数值");
    }

}

/**
 * replace(String a,String)方法  返回值String
 *第一个参数：String a 要被替换的字符串
 *第二个参数：String b 用于替换的字符串
 *作用：用于替换字符串中特定字串：不支持正则
 */
@Test
    public void testReplace(){
    String url="www.baidu.com";
    url.replace("baidu","zhang"); //覆盖
    System.out.println("替换子字符串"+url);
}

/**
 * replaceAll(正则，过滤效果) 替换字符串
 * 作用：替换所有字符串，支持正则
 *
 */
@Test
    public void testAll(){
    String regex="^[\\u4e00-\\u9fa5]{0,}$";
    String str="字符串";
    str.replaceAll(regex,"***");
    //str.replace(regex,"***");
    System.out.println("支持正则"+str);
}

/**
 * split()   返回值：String()   返回数据--遍历
 * 作用：按照正则或者字符串方式分割字符串
 * .正则里特殊表达含义：匹配一个字符
 * \\.代表.
 * 需求：www.baidu.com 按照点的方式分割url地址
 *
 */
@Test
    public void testSplit(){
    String url="www.baidu.com";
    String[] str=url.split("\\.");
    //增强for 遍历 str 字符串数组
    for(String s:str){//接收类型 字符串数组引用
        System.out.println("切割后字符串"+s);
    }
    System.out.println(str[1]);
}
    //查API---split方法---数组下标越界
    //String字符串：重点：替换,截取【需要知道下标】，分割【获取部分子字符串】
    //StringBuilder与StringBuffer 【方法完全一致，功能：追加：插入：替换】
    // 解决：String类拼接【不要用+】内存溢出--硬盘--程序会卡
    //"123"+"456"+"789"  牵扯拼接，建议SB
    /**笔试题
     * StringBuilder与StringBuffer的区别？
     *
     * StringBuilder---JDK1.5--不考虑线性安全【效率高】
     * StringBuffer---JDK1.0--考虑线性安全【效率低】
     *
     */

}
